home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / dev / e / capus2.lha / capus2 / 3DView / Sources / 3Dview.e < prev    next >
Encoding:
Text File  |  1995-04-03  |  35.7 KB  |  974 lines

  1. /*=========================================================================================*/
  2. /* Source code generate by Gui2E v0.1 © 1994 NasGûl                                        */
  3. /*=========================================================================================*/
  4. /*"Peps Header"*/
  5. /*======<<< Peps Header >>>======
  6.  PRGVERSION '0'
  7.  ================================
  8.  PRGREVISION '81'
  9.  ================================
  10.  AUTHOR      'NasGûl'
  11.  ===============================*/
  12. /*======<<<   History   >>>======
  13.  - v0.1 Imagine/Cyber v2.0/Sculpt (rotation/zoom). (04/02/94)
  14.  - v0.2 Vertex v1.62a et v1.73.1f/start_cli et start_wb. (07/02/94)
  15.  - v0.3 3Dpro v1.10 Final. (12/02/94)
  16.  - v0.4 Cyber v1.0. (modification de 3Dview.m <ID_3D3D> <TYPE_OLDCYBER> <TYPE_NEWCYBER>)
  17.         Ajout palette (Fond gris/trait noir ou Fond noir/trait blanc (15/02/94).
  18.  - v0.5 Ajout des commandes L (load) A (ajouter objet) M (multi-load) (16/02/94).
  19.  - v0.6 Ajout de la fonction F10 (informations sur les objets).
  20.         l'interface a été faite avec GadToolBox et convertit avec Gui2E.
  21.         (modification de 3Dview.m Ajout de object3d.bounded (true ou false))
  22.         La routine readimaginefile() ne charge plus que les objets ayant des points (17/02/94).
  23.  - v0.7 Les commandes sont en menus.
  24.         l'écran est du type SUPER_HIRESLACE (non paramètrable).
  25.         Récritures des routines p_StartWB() et p_StartCLI() (multi-arguments possible).
  26.         Les couleurs (font gris/trait noir ou fond noir trait blianc) ont disparus,
  27.         a la place on peut choisir la couleurs des points,faces,des objects selectionnés et
  28.         de la boite d'encadrement (bounding).
  29.  - v0.8 Sauve en binaire (pour l'utilisation de la vector.library).
  30.         Charge les objets au format Vertex 2.0 (nouveau format) (07-10-94).
  31.         Ajout d'un Port Arexx.
  32.  - v0.9 Localisation.
  33.  ===============================*/
  34. /**/
  35. OPT OSVERSION=37,LARGE
  36. /*"Modules"*/
  37. MODULE 'intuition/intuition','gadtools','libraries/gadtools','intuition/gadgetclass','intuition/screens',
  38.        'graphics/text','exec/lists','exec/nodes','exec/ports','eropenlib','utility/tagitem'
  39. MODULE 'graphics/displayinfo'
  40. MODULE 'diskfont'
  41. MODULE '3dviewnew'
  42. MODULE 'reqtools','libraries/reqtools'
  43. MODULE 'mathtrans'
  44. MODULE 'intuition/intuitionbase'
  45. MODULE 'workbench/startup'
  46. MODULE 'rexxsyslib','rexx/storage'
  47. MODULE 'mheader'
  48. /**/
  49. /*"Globals définitions"*/
  50. ENUM ER_NONE,ER_SCREENSIG,ER_SCREEN,ER_LOCKSCREEN,ER_VISUAL,ER_CONTEXT,ER_MENUS,ER_GADGET,ER_WINDOW,
  51.      ER_MEM,ER_BADARGS,ER_INITBASE,ER_NOFICHIER,ER_OPEN,ER_INCONNU,OK_FICHIER,ER_FONT,
  52.      ER_PORT,ER_PORTEXIST,ER_CREATEPORT
  53.  
  54.  
  55. RAISE ER_MEM IF New()=NIL,
  56.       ER_MEM IF String()=NIL
  57.  
  58. CONST DEBUG=FALSE
  59.  
  60. CONST OBJ_SELECT=0,
  61.       OBJ_DESELECT=1,
  62.       OBJ_COUNTPTSFCS=2,
  63.       SAVE_BIN=3,
  64.       TYPE_VERTEX2=8,
  65.       ID_3DDD=$33444444
  66.  
  67. DEF screen:PTR TO screen,
  68.     visual=NIL,
  69.     tattr:PTR TO textattr,
  70.     myfont,
  71.     reelquit=FALSE,
  72.     offy,offx,
  73.     titlescreen[256]:STRING
  74. /*"view Definitions"*/
  75. /*=== menus constants ===*/
  76. ENUM MENU_LOADNEW,MENU_LOADADD,
  77.      MENU_SAVE_OBJSELECT,MENU_SAVE_OBJDESELECT,MENU_SAVE_OBJALL,
  78.      MENU_SAVE_DXF,MENU_SAVE_GEO,MENU_SAVE_RAY,MENU_SAVE_BIN,MENU_SAVEBASE,
  79.      MENU_CONFIGURATION,
  80.      MENU_QUITTER,
  81.      MENU_MODE_PTS,MENU_MODE_FCS,MENU_MODE_PTSFCS,
  82.      MENU_VUE_XOY,MENU_VUE_XOZ,MENU_VUE_YOZ,
  83.      MENU_COORD_INVX,MENU_COORD_INVY,MENU_COORD_INVZ,
  84.      MENU_ZOOM_P_PLUS,MENU_ZOOM_P_MOINS,MENU_ZOOM_G_PLUS,MENU_ZOOM_G_MOINS,
  85.      MENU_ROT_UP,MENU_ROT_DOWN,MENU_ROT_LEFT,MENU_ROT_RIGHT,MENU_OBJCENTRE,MENU_INFORMATION,
  86.      MENU_SELECTALL,MENU_DESELECTALL,MENU_OBJSELECTION,
  87.      MENU_COUL_PTS,MENU_COUL_FCS,MENU_COUL_OBJSELECT,MENU_COUL_BOUNDING
  88.  
  89. DEF view_window=NIL:PTR TO window
  90. DEF view_glist=NIL
  91. DEF view_menu=NIL
  92. /**/
  93. /*"config Definitions"*/
  94. DEF config_window=NIL:PTR TO window
  95. DEF config_glist=NIL
  96. /*==================*/
  97. /*     Gadgets      */
  98. /*==================*/
  99. CONST GA_G_FCT3DPRO=0
  100. CONST GA_G_FCTSCULPT=1
  101. CONST GA_G_FCTIMAGINE=2
  102. CONST GA_G_FCTVERTEX=3
  103. CONST GA_G_CONFIGOK=4
  104. CONST GA_G_CONFIGCANCEL=5
  105. /*=============================
  106.  = Gadgets labels of config
  107.  =============================*/
  108. DEF g_fct3dpro
  109. DEF g_fctsculpt
  110. DEF g_fctimagine
  111. DEF g_fctvertex
  112. DEF g_configok
  113. DEF g_configcancel
  114. /**/
  115. /*"info Definitions"*/
  116. DEF info_window=NIL:PTR TO window
  117. DEF info_glist=NIL
  118. /*==================*/
  119. /*     Gadgets      */
  120. /*==================*/
  121. CONST GA_G_INFOTOTALPTS=0
  122. CONST GA_G_INFOTOTALFCS=1
  123. CONST GA_G_INFOTOTALOBJ=2
  124. CONST GA_G_INFODELOBJ=3
  125. CONST GA_G_OBJMODE=4
  126. CONST GA_G_INFONBRSPTS=5
  127. CONST GA_G_INFONBRSFCS=6
  128. CONST GA_G_INFOMINX=7
  129. CONST GA_G_INFOMAXX=8
  130. CONST GA_G_INFOMINY=9
  131. CONST GA_G_INFOMAXY=10
  132. CONST GA_G_INFOMINZ=11
  133. CONST GA_G_INFOMAXZ=12
  134. CONST GA_G_INFOCENX=13
  135. CONST GA_G_INFOCENY=14
  136. CONST GA_G_INFOCENZ=15
  137. CONST GA_G_INFOTYPE=16
  138. CONST GA_G_INFOOK=17
  139. CONST GA_G_INFOLIST=18
  140. /*=============================
  141.  = Gadgets labels of info
  142.  =============================*/
  143. DEF g_infototalpts
  144. DEF g_infototalfcs
  145. DEF g_infototalobj
  146. DEF g_infodelobj
  147. DEF g_objmode
  148. DEF g_infonbrspts
  149. DEF g_infonbrsfcs
  150. DEF g_infominx
  151. DEF g_infomaxx
  152. DEF g_infominy
  153. DEF g_infomaxy
  154. DEF g_infominz
  155. DEF g_infomaxz
  156. DEF g_infocenx
  157. DEF g_infoceny
  158. DEF g_infocenz
  159. DEF g_infotype
  160. DEF g_infook
  161. DEF g_infolist
  162. /**/
  163. /*"Applications Définitions"*/
  164. DEF screensig=-1                  /*==== Signal for pubscreen  ====*/
  165. DEF mybase:PTR TO database3d      /*==== pointer to database3d ====*/
  166. DEF data_objtype[20]:LIST         /*==== List content string types ====*/
  167. DEF data_boundedbox[36]:LIST      /*==== just a 3D cube ====*/
  168. DEF defaultreqdir[256]:STRING     /*==== dir by default for FileRequester ====*/
  169. DEF curobjnode=-1                 /*==== Current node selected ====*/
  170. DEF stringvue:PTR TO LONG         /*==== for titlescreen ====*/
  171. DEF arglist[100]:LIST             /*==== E list with arg ====*/
  172. /**/
  173. /**/
  174. /*"Pmodules Lists"*/
  175. PMODULE '3DViewerLoadObject'
  176. PMODULE '3DViewerSaveObject'
  177. PMODULE '3DViewerList'
  178. PMODULE '3DWindows'
  179. PMODULE '3DFonctions'
  180. PMODULE '3DArexx'
  181. PMODULE '3DView_Cat'
  182. PMODULE 'PModules:dWriteF'
  183. PMODULE 'PModules:PMheader'
  184. PMODULE 'PModules:pListView'
  185. /**/
  186. /*"Message Proc"*/
  187. /*"p_LookAllMessage() :Attend les messages sur les ports IDCMP de toutes fenêtres."*/
  188. PROC p_LookAllMessage() 
  189.     DEF sigreturn
  190.     DEF viewport:PTR TO mp
  191.     DEF configport:PTR TO mp
  192.     DEF infoport:PTR TO mp
  193.     IF view_window THEN viewport:=view_window.userport ELSE viewport:=NIL
  194.     IF config_window THEN configport:=config_window.userport ELSE configport:=NIL
  195.     IF info_window THEN infoport:=info_window.userport ELSE infoport:=NIL
  196.     sigreturn:=Wait(Shl(1,viewport.sigbit) OR
  197.                     Shl(1,configport.sigbit) OR
  198.                     Shl(1,infoport.sigbit) OR
  199.                     Shl(1,arexxport.sigbit) OR
  200.                     $F000)
  201.     IF (sigreturn AND Shl(1,viewport.sigbit))
  202.         p_LookviewMessage()
  203.     ENDIF
  204.     IF (sigreturn AND Shl(1,configport.sigbit))
  205.         IF (p_LookconfigMessage())=TRUE
  206.             p_RemconfigWindow()
  207.         ENDIF
  208.     ENDIF
  209.     IF (sigreturn AND Shl(1,infoport.sigbit))
  210.         IF (p_LookinfoMessage())=TRUE
  211.             p_ReminfoWindow()
  212.             p_DrawBase()
  213.         ENDIF
  214.     ENDIF
  215.     IF (sigreturn AND Shl(1,arexxport.sigbit))
  216.         p_LookArexxMessage()
  217.     ENDIF
  218.     IF (sigreturn AND $F000)
  219.         reelquit:=TRUE
  220.     ENDIF
  221. ENDPROC
  222. /**/
  223. /*"p_LookviewMessage() :Examine les messages sur le port IDCMP de view_window."*/
  224. PROC p_LookviewMessage() 
  225.     DEF mes:PTR TO intuimessage
  226.     DEF g:PTR TO gadget
  227.     DEF type=0,infos=NIL
  228.     WHILE mes:=Gt_GetIMsg(view_window.userport)
  229.         type:=mes.class
  230.         dWriteF(['Type $\h\n'],[type])
  231.         SELECT type
  232.             CASE IDCMP_MENUVERIFY
  233.                 infos:=mes.code
  234.                 dWriteF(['MENUVERIFY Info $\h\n'],[infos])
  235.             CASE IDCMP_MENUPICK
  236.                 infos:=mes.code
  237.                 dWriteF(['Info $\h\n'],[infos])
  238.                 p_LookMenusAction(infos)
  239.             CASE (IDCMP_GADGETDOWN OR IDCMP_GADGETUP)
  240.                 g:=mes.iaddress
  241.                 infos:=g.gadgetid
  242.                 SELECT infos
  243.                 ENDSELECT
  244.         ENDSELECT
  245.         Gt_ReplyIMsg(mes)
  246.     ENDWHILE
  247. ENDPROC
  248. /**/
  249. /*"p_LookMenusAction(inf) :Traite l'informations des menus."*/
  250. PROC p_LookMenusAction(inf)
  251.     DEF para_r,plan,win
  252.     DEF it_adr:PTR TO menuitem,sel
  253.     WHILE it_adr:=ItemAddress(view_window.menustrip,inf)
  254.         sel:=Long(it_adr+34)
  255.         SELECT sel
  256.             /*==== MENU FICHIER ====*/
  257.             CASE MENU_LOADNEW /*==== Charger Nouveau  ====*/
  258.                 IF p_MakeRequest(get_3DView_string(REQ_DELOBJ),get_3DView_string(REQ_DELOBJ_GAD),NIL)
  259.                     mybase.objlist:=p_CleanList(mybase.objlist,TRUE,[DISP,22,DISP,26,DISE],LIST_CLEAN)
  260.                     mybase.totalpts:=0;mybase.totalfcs:=0
  261.                     IF p_FileRequester(get_3DView_string(REQFILE_NEW))
  262.                         IF info_window<>NIL THEN p_RenderinfoWindow()
  263.                         p_AllObjects(OBJ_COUNTPTSFCS)
  264.                         p_RebuildMinMax()
  265.                         p_DrawBase()
  266.                     ENDIF
  267.                 ENDIF
  268.             CASE MENU_LOADADD /*==== Charger Ajouter ====*/
  269.                 IF p_FileRequester(get_3DView_string(REQFILE_AJOUTER))
  270.                     IF info_window<>NIL THEN p_RenderinfoWindow()
  271.                     p_AllObjects(OBJ_COUNTPTSFCS)
  272.                     p_RebuildMinMax()
  273.                     p_DrawBase()
  274.                 ENDIF
  275.             /*=======================================*/
  276.             /*==== Menu Sauver (séléction). ====*/
  277.             CASE MENU_SAVE_OBJSELECT    /*==== Sauver (selected obj) ====*/
  278.                 mybase.savewhat:=MENU_SAVE_OBJSELECT
  279.             CASE MENU_SAVE_OBJDESELECT  /*==== Sauver (no-selected obj ====*/
  280.                 mybase.savewhat:=MENU_SAVE_OBJDESELECT
  281.             CASE MENU_SAVE_OBJALL       /*==== Tous les obj ====*/
  282.                 mybase.savewhat:=MENU_SAVE_OBJALL
  283.             /*=======================================*/
  284.             /*==== Menu Sauver (Format). ====*/
  285.             CASE MENU_SAVE_DXF   /*==== Format DXF ====*/
  286.                 mybase.saveformat:=SAVE_DXF
  287.             CASE MENU_SAVE_GEO  /*==== Format Geo ====*/
  288.                 mybase.saveformat:=SAVE_GEO
  289.             CASE MENU_SAVE_RAY /*==== Format Ray ====*/
  290.                 mybase.saveformat:=SAVE_RAY
  291.             CASE MENU_SAVE_BIN
  292.                 mybase.saveformat:=SAVE_BIN
  293.             CASE MENU_SAVEBASE
  294.                 para_r:=mybase.saveformat
  295.                 SELECT para_r
  296.                     CASE SAVE_DXF
  297.                         p_SaveDxfFile(mybase.savewhat)
  298.                     CASE SAVE_GEO
  299.                         p_SaveGeoFile(mybase.savewhat)
  300.                     CASE SAVE_RAY
  301.                         p_SaveRayFile(mybase.savewhat)
  302.                     CASE SAVE_BIN
  303.                         p_SaveBinFile(mybase.savewhat)
  304.                 ENDSELECT
  305.             /*=======================================*/
  306.             CASE MENU_CONFIGURATION /*==== Configuration ====*/
  307.                 IF config_window=NIL
  308.                     IF (win:=p_OpenTheConfigWindow())<>ER_NONE
  309.                         p_MakeRequest(get_3DView_string(REQ_NO_INFOWINDOW),get_3DView_string(REQ_NO_INFOWINDOW_GAD),0)
  310.                     ENDIF
  311.                 ENDIF
  312.             /*=======================================*/
  313.             CASE MENU_QUITTER /*==== Quitter ====*/
  314.                 reelquit:=TRUE
  315.             /*==== MENU VUES ====*/
  316.             /*==== Menu Modes ====*/
  317.             CASE MENU_MODE_PTS    /*==== Mode Points ====*/
  318.                 mybase.drawmode:=DRAW_PTS
  319.                 p_DrawBase()
  320.             CASE MENU_MODE_FCS    /*==== Mode Faces ====*/
  321.                 mybase.drawmode:=DRAW_FCS
  322.                 p_DrawBase()
  323.             CASE MENU_MODE_PTSFCS /*==== Mode Pts+Fcs ====*/
  324.                 mybase.drawmode:=DRAW_PTSFCS
  325.                 p_DrawBase()
  326.             /*=======================================*/
  327.             /*==== Menu Vue en ====*/
  328.             CASE MENU_VUE_XOY   /*==== Vue en XOY ====*/
  329.                 mybase.plan:=PLAN_XOY
  330.                 p_RefreshScreenTitle()
  331.                 p_DrawBase()
  332.             CASE MENU_VUE_XOZ  /*==== Vue en XOZ ====*/
  333.                 mybase.plan:=PLAN_XOZ
  334.                 p_RefreshScreenTitle()
  335.                 p_DrawBase()
  336.             CASE MENU_VUE_YOZ /*==== Vue en YOZ ====*/
  337.                 mybase.plan:=PLAN_YOZ
  338.                 p_RefreshScreenTitle()
  339.                 p_DrawBase()
  340.             /*=======================================*/
  341.             /*==== Menu coordonnées ====*/
  342.             CASE MENU_COORD_INVX   /*==== Inverse Coord. en x ====*/
  343.                 IF mybase.signex=1 THEN mybase.signex:=-1 ELSE mybase.signex:=1
  344.                 p_RefreshScreenTitle()
  345.                 p_DrawBase()
  346.             CASE MENU_COORD_INVY  /*====    "      "     " y ====*/
  347.                 IF mybase.signey=1 THEN mybase.signey:=-1 ELSE mybase.signey:=1
  348.                 p_RefreshScreenTitle()
  349.                 p_DrawBase()
  350.             CASE MENU_COORD_INVZ /*====    "      "     " z ====*/
  351.                 IF mybase.signez=1 THEN mybase.signez:=-1 ELSE mybase.signez:=1
  352.                 p_RefreshScreenTitle()
  353.                 p_DrawBase()
  354.             /*=======================================*/
  355.             /*==== Menu Zoom ====*/
  356.             CASE MENU_ZOOM_P_PLUS   /*==== Petit Zoom + ====*/
  357.                 mybase.echelle:=SpAdd(mybase.echelle,0.01)
  358.                 p_RefreshScreenTitle()
  359.                 p_DrawBase()
  360.             CASE MENU_ZOOM_P_MOINS  /*==== Petit Zoom - ====*/
  361.                 mybase.echelle:=SpSub(0.01,mybase.echelle)
  362.                 p_RefreshScreenTitle()
  363.                 p_DrawBase()
  364.             CASE MENU_ZOOM_G_PLUS /*==== Grand Zoom + ====*/
  365.                 mybase.echelle:=SpMul(mybase.echelle,2.0)
  366.                 p_RefreshScreenTitle()
  367.                 p_DrawBase()
  368.             CASE MENU_ZOOM_G_MOINS /*==== Grand Zoom - ====*/
  369.                 mybase.echelle:=SpMul(mybase.echelle,0.5)
  370.                 p_RefreshScreenTitle()
  371.                 p_DrawBase()
  372.             /*=======================================*/
  373.             /*==== Menu Rotation ====*/
  374.             CASE MENU_ROT_UP  /*==== En Haut ====*/
  375.                 para_r:=SpDiv(180.0,SpMul(mybase.anglerotation,3.14159))
  376.                 plan:=mybase.plan
  377.                 SELECT plan
  378.                     CASE PLAN_XOY
  379.                         dWriteF(['Axe :\d ','Angle \d\n'],[AXE_X,para_r])
  380.                         p_RotationBase(AXE_X,para_r)
  381.                     CASE PLAN_YOZ
  382.                         p_RotationBase(AXE_Y,para_r)
  383.                     CASE PLAN_XOZ
  384.                         p_RotationBase(AXE_X,para_r)
  385.                     DEFAULT; NOP
  386.                 ENDSELECT
  387.                 p_RebuildMinMax()
  388.                 p_DrawBase()
  389.             CASE MENU_ROT_DOWN  /*==== En Bas  ====*/
  390.                 para_r:=SpDiv(180.0,SpMul(SpNeg(mybase.anglerotation),3.14159))
  391.                 plan:=mybase.plan
  392.                 SELECT plan
  393.                     CASE PLAN_XOY
  394.                         p_RotationBase(AXE_X,para_r)
  395.                     CASE PLAN_YOZ
  396.                         p_RotationBase(AXE_Y,para_r)
  397.                     CASE PLAN_XOZ
  398.                         p_RotationBase(AXE_X,para_r)
  399.                     DEFAULT; NOP
  400.                 ENDSELECT
  401.                 p_RebuildMinMax()
  402.                 p_DrawBase()
  403.             CASE MENU_ROT_LEFT /*==== a gauche ====*/
  404.                 para_r:=SpDiv(180.0,SpMul(mybase.anglerotation,3.14159))
  405.                 plan:=mybase.plan
  406.                 SELECT plan
  407.                     CASE PLAN_XOY
  408.                         p_RotationBase(AXE_Y,para_r)
  409.                     CASE PLAN_YOZ
  410.                         p_RotationBase(AXE_Z,para_r)
  411.                     CASE PLAN_XOZ
  412.                         p_RotationBase(AXE_Z,para_r)
  413.                     DEFAULT; NOP
  414.                 ENDSELECT
  415.                 p_RebuildMinMax()
  416.                 p_DrawBase()
  417.             CASE MENU_ROT_RIGHT /*==== a droite ====*/
  418.                 para_r:=SpDiv(180.0,SpMul(SpNeg(mybase.anglerotation),3.14159))
  419.                 plan:=mybase.plan
  420.                 SELECT plan
  421.                     CASE PLAN_XOY
  422.                         p_RotationBase(AXE_Y,para_r)
  423.                     CASE PLAN_YOZ
  424.                         p_RotationBase(AXE_Z,para_r)
  425.                     CASE PLAN_XOZ
  426.                         p_RotationBase(AXE_Z,para_r)
  427.                     DEFAULT; NOP
  428.                 ENDSELECT
  429.                 p_RebuildMinMax()
  430.                 p_DrawBase()
  431.             CASE MENU_OBJCENTRE /*==== centre les objs ====*/
  432.                 p_CentreObjs()
  433.                 p_DrawBase()
  434.                 p_RebuildMinMax()
  435.             /*==== MENU OBJETS ====*/
  436.             CASE MENU_SELECTALL /*==== Select tous les objs ====*/
  437.                 p_AllObjects(OBJ_SELECT)
  438.                 p_DrawBase()
  439.             CASE MENU_DESELECTALL /*==== Deselect tous les objs ====*/
  440.                 p_AllObjects(OBJ_DESELECT)
  441.                 p_DrawBase()
  442.             CASE MENU_OBJSELECTION /*==== Selection ====*/
  443.                 IF info_window=NIL 
  444.                     IF (win:=p_OpenTheInfoWindow())<>ER_NONE
  445.                         p_MakeRequest(get_3DView_string(REQ_NO_INFOWINDOW),get_3DView_string(REQ_NO_INFOWINDOW_GAD),0)
  446.                     ENDIF
  447.                 ENDIF
  448.             /*=======================================*/
  449.             /*==== Menu Couleurs ====*/
  450.             CASE MENU_COUL_PTS   /*==== Couleur points ====*/
  451.                 para_r:=p_MakePaletteRequest(get_3DView_string(REQ_COLOR_POINTS),mybase.rgbpts)
  452.                 IF para_r<>-1 THEN mybase.rgbpts:=para_r
  453.                 p_DrawBase()
  454.             CASE MENU_COUL_FCS  /*==== Couleur faces ====*/
  455.                 para_r:=p_MakePaletteRequest(get_3DView_string(REQ_COLOR_FACES),mybase.rgbnormal)
  456.                 IF para_r<>-1 
  457.                     mybase.rgbnormal:=para_r
  458.                     p_DrawBase()
  459.                 ENDIF
  460.             CASE MENU_COUL_OBJSELECT /*==== Couleur obj select. ====*/
  461.                 para_r:=p_MakePaletteRequest(get_3DView_string(REQ_COLOR_SELECTEDOBJ),mybase.rgbselect)
  462.                 IF para_r<>-1 
  463.                     mybase.rgbselect:=para_r
  464.                     p_DrawBase()
  465.                 ENDIF
  466.             CASE MENU_COUL_BOUNDING /*==== Couleur encadrement. ====*/
  467.                 para_r:=p_MakePaletteRequest(get_3DView_string(REQ_COLOR_BOUNDING),mybase.rgbbounding)
  468.                 IF para_r<>-1 
  469.                     mybase.rgbbounding:=para_r
  470.                     p_DrawBase()
  471.                 ENDIF
  472.         ENDSELECT
  473.         inf:=it_adr.nextselect
  474.     ENDWHILE
  475. ENDPROC
  476. /**/
  477. /*"p_LookconfigMessage() :Examine les messages sur le port IDCMP de config_window."*/
  478. PROC p_LookconfigMessage() 
  479.    DEF mes:PTR TO intuimessage
  480.    DEF g:PTR TO gadget
  481.    DEF gstr:PTR TO stringinfo
  482.    DEF type=0,infos=NIL
  483.    DEF ret=FALSE
  484.    DEF f_3dpro,f_sculpt,f_imagine,f_vertex,change=FALSE
  485.    f_3dpro:=mybase.fct3dpro
  486.    f_sculpt:=mybase.fctsculpt
  487.    f_imagine:=mybase.fctimagine
  488.    f_vertex:=mybase.fctvertex
  489.    WHILE mes:=Gt_GetIMsg(config_window.userport)
  490.        type:=mes.class
  491.        SELECT type
  492.            CASE IDCMP_MENUPICK
  493.               infos:=mes.code
  494.               p_LookMenusAction(infos)
  495.            CASE IDCMP_GADGETUP
  496.               g:=mes.iaddress
  497.               infos:=g.gadgetid
  498.               gstr:=g.specialinfo
  499.               dWriteF(['Config Window Gadget Info $\h\n'],[infos])
  500.               SELECT infos
  501.                   CASE GA_G_FCT3DPRO
  502.                       mybase.fct3dpro:=p_StringToFloat(gstr.buffer)
  503.                   CASE GA_G_FCTSCULPT
  504.                       mybase.fctsculpt:=p_StringToFloat(gstr.buffer)
  505.                   CASE GA_G_FCTIMAGINE
  506.                       mybase.fctimagine:=p_StringToFloat(gstr.buffer)
  507.                   CASE GA_G_FCTVERTEX
  508.                       mybase.fctvertex:=p_StringToFloat(gstr.buffer)
  509.                   CASE GA_G_CONFIGOK
  510.                       ret:=TRUE
  511.                       change:=TRUE
  512.                   CASE GA_G_CONFIGCANCEL
  513.                       ret:=TRUE
  514.               ENDSELECT
  515.            CASE IDCMP_CLOSEWINDOW
  516.                ret:=TRUE
  517.        ENDSELECT
  518.        Gt_ReplyIMsg(mes)
  519.    ENDWHILE
  520.    IF change=TRUE
  521.        mybase.fct3dpro:=f_3dpro
  522.        mybase.fctsculpt:=f_sculpt
  523.        mybase.fctimagine:=f_imagine
  524.        mybase.fctvertex:=f_vertex
  525.     ENDIF
  526.    RETURN ret
  527. ENDPROC
  528. /**/
  529. /*"p_LookinfoMessage() :Examine les messages sur le port IDCMP de info_window."*/
  530. PROC p_LookinfoMessage() 
  531.    DEF mes:PTR TO intuimessage
  532.    DEF g:PTR TO gadget
  533.    DEF type=0,infos=NIL,ret=FALSE
  534.    DEF iobj:PTR TO object3d
  535.    WHILE mes:=Gt_GetIMsg(info_window.userport)
  536.        type:=mes.class
  537.        SELECT type
  538.            CASE IDCMP_MENUPICK
  539.               infos:=mes.code
  540.               p_LookMenusAction(infos)
  541.            CASE IDCMP_CLOSEWINDOW
  542.                ret:=TRUE
  543.            CASE IDCMP_GADGETDOWN 
  544.               g:=mes.iaddress
  545.               infos:=g.gadgetid
  546.               SELECT infos
  547.                   CASE GA_G_OBJMODE
  548.                       infos:=mes.code
  549.                       iobj:=p_GetAdrNode(mybase.objlist,curobjnode)
  550.                       SELECT infos
  551.                           CASE 0
  552.                             iobj.selected:=FALSE
  553.                             iobj.bounded:=FALSE
  554.                           CASE 1
  555.                             iobj.selected:=TRUE
  556.                             iobj.bounded:=FALSE
  557.                           CASE 2
  558.                             iobj.selected:=FALSE
  559.                             iobj.bounded:=TRUE
  560.                           DEFAULT; NOP
  561.                       ENDSELECT
  562.                   ENDSELECT
  563.            CASE IDCMP_GADGETUP
  564.               g:=mes.iaddress
  565.               infos:=g.gadgetid
  566.               SELECT infos
  567.                   CASE GA_G_INFOTOTALPTS
  568.                   CASE GA_G_INFOTOTALFCS
  569.                   CASE GA_G_INFOTOTALOBJ
  570.                   CASE GA_G_INFODELOBJ
  571.                       p_LockListView(g_infolist,info_window)
  572.                       curobjnode:=p_EnleveNode(mybase.objlist,curobjnode,TRUE,[DISP,22,DISP,26,DISE])
  573.                       p_UnLockListView(g_infolist,info_window,mybase.objlist)
  574.                       p_AllObjects(OBJ_COUNTPTSFCS)
  575.                       p_RenderinfoWindow()
  576.                   CASE GA_G_INFONBRSPTS
  577.                   CASE GA_G_INFONBRSFCS
  578.                   CASE GA_G_INFOMINX
  579.                   CASE GA_G_INFOMAXX
  580.                   CASE GA_G_INFOMINY
  581.                   CASE GA_G_INFOMAXY
  582.                   CASE GA_G_INFOMINZ
  583.                   CASE GA_G_INFOMAXZ
  584.                   CASE GA_G_INFOCENX
  585.                   CASE GA_G_INFOCENY
  586.                   CASE GA_G_INFOCENZ
  587.                   CASE GA_G_INFOTYPE
  588.                   CASE GA_G_INFOOK
  589.                       ret:=TRUE
  590.                   CASE GA_G_INFOLIST
  591.                       curobjnode:=mes.code
  592.                       p_RenderinfoWindow()
  593.               ENDSELECT
  594.        ENDSELECT
  595.        Gt_ReplyIMsg(mes)
  596.    ENDWHILE
  597.    RETURN ret
  598. ENDPROC
  599. /**/
  600. /**/
  601. /*"Application procédures."*/
  602. /*"p_Init3DBase() :Initialise la base de données."*/
  603. PROC p_Init3DBase() HANDLE 
  604.     /*==== Allocate mem for structure ====*/
  605.     DEF e[20]:STRING
  606.     DEF rp
  607.     mybase:=New(SIZEOF database3d)      
  608.     mybase.nbrsobjs:=0
  609.     mybase.totalpts:=0
  610.     mybase.totalfcs:=0
  611.     mybase.objlist:=p_InitList()
  612.     /*mybase.fct3dpro:=0.1*/
  613.     mybase.fct3dpro:=0.1
  614.     mybase.fctsculpt:=0.001
  615.     mybase.fctimagine:=1.0
  616.     mybase.fctvertex:=0.0001
  617.     mybase.minx:=0
  618.     mybase.maxx:=0
  619.     mybase.miny:=0
  620.     mybase.maxy:=0
  621.     mybase.minz:=0
  622.     mybase.maxz:=0
  623.     mybase.echelle:=0.1
  624.     mybase.plan:=PLAN_XOY
  625.     mybase.basecx:=0
  626.     mybase.basecy:=0
  627.     mybase.basecz:=0
  628.     mybase.signex:=1
  629.     mybase.signey:=1
  630.     mybase.signez:=1
  631.     mybase.anglerotation:=10.0
  632.     mybase.rgbpts:=7
  633.     mybase.rgbnormal:=1
  634.     mybase.rgbselect:=6
  635.     mybase.rgbbounding:=3
  636.     mybase.drawmode:=DRAW_PTSFCS
  637.     mybase.saveformat:=SAVE_DXF
  638.     mybase.savewhat:=MENU_SAVE_OBJALL
  639.     mybase.palette:=[$689,$002,$DDD,$458,$B6C,$FB1,$F48,$CFA]:INT
  640.     /*==== All objects types ====*/
  641.     data_objtype:=['Imagine','Cyber v1.0','Cyber v2.0','Sculpt',
  642.                    'Vertex<v1.62a','Vertex>v1.73.f','3Dpro','LightWave','Vertex v2.0']
  643.     /*==== Data for bound object ====*/
  644.     data_boundedbox:=[0,2,1,0,3,2,3,6,2,3,7,6,7,5,6,7,4,5,4,0,1,4,1,5,1,2,6,1,6,5,4,7,3,4,3,0]
  645.     /*==== String for info plan ====*/
  646.     stringvue:=['Plan XOY','Plan YOZ','Plan XOZ']
  647.     /*==== Default Dir for FileRequester ====*/
  648.     StrCopy(defaultreqdir,'Ram:',ALL)
  649.     StrCopy(e,p_FloatToString(mybase.echelle),ALL)
  650.     StringF(titlescreen,'\l\s[32]       \s:\s Sx:\d[2] Sy:\d[2] Sz:\d[2] \s:\s',title_req,get_3DView_string(DMENU_VUES),stringvue[mybase.plan],mybase.signex,mybase.signey,mybase.signez,get_3DView_string(TEXT_SCALE),e)
  651.     IF (rp:=p_CreateArexxPort('3DViewPort',0))<>ER_NONE THEN Raise(rp)
  652.     Raise(ER_NONE)
  653. EXCEPT
  654.     RETURN exception
  655. ENDPROC
  656. /**/
  657. /*"p_Rem3DBase() :libère la mémoire allouée pour les objets."*/
  658. PROC p_Rem3DBase() 
  659.     IF arexxport THEN p_DeleteArexxPort(arexxport)
  660.     IF mybase
  661.         p_CleanList(mybase.objlist,TRUE,[DISP,22,DISP,26,DISE],LIST_REMOVE)
  662.     ENDIF
  663. ENDPROC
  664. /**/
  665. /*"p_InitReq(titre) :Initialise un mini requester (window),<titre>=Titre."*/
  666. PROC p_InitReq(titre)
  667. /********************************************************************************
  668.  * Para         : Title (STRING).
  669.  * Return       : address of the window.
  670.  * Description  : Open a little Window (center on 3DviewScreen).
  671.  *******************************************************************************/
  672.     DEF w,wx,wy,p_itext:PTR TO intuitext,long
  673.     p_itext:=New(SIZEOF intuitext)
  674.     p_itext.itextfont:=tattr
  675.     p_itext.itext:=String(EstrLen(titre))
  676.     StrCopy(p_itext.itext,titre,ALL)
  677.     p_itext.nexttext:=NIL
  678.     long:=IntuiTextLength(p_itext)
  679.     wx:=Div(screen.width,2)-Div(long,2)
  680.     wy:=Div(screen.height,2)-5
  681.     w:=OpenW(wx,wy,long,18,$100,$0,titre,IF screen THEN screen ELSE 0,IF screen THEN 15 ELSE 1,NIL)
  682.     Dispose(p_itext)
  683.     RETURN w
  684. ENDPROC
  685. /**/
  686. /*"p_FileRequester(a) :PopUp a multifile requester (Reqtools.library),<a>=texte du gadget ok."*/
  687. PROC p_FileRequester(a)
  688. /*===============================================================================
  689.  = Para         : Text of ok gadget.
  690.  = Return       : False if cancel selected.
  691.  = Description  : PopUp a MultiFileRequester,build the whatview arguments.
  692.  ==============================================================================*/
  693.     DEF reqfile:PTR TO rtfilerequester
  694.     DEF liste:PTR TO rtfilelist
  695.     DEF buffer[120]:STRING
  696.     DEF add_liste=0
  697.     DEF ret=FALSE
  698.     DEF the_reelname[256]:STRING
  699.     DEF thefile[256]:STRING
  700.     reqfile:=NIL
  701.     dWriteF(['p_WVFileRequester()\n'],[0])
  702.     IF reqfile:=RtAllocRequestA(RT_FILEREQ,NIL)
  703.         buffer[0]:=0
  704.         RtChangeReqAttrA(reqfile,[RTFI_DIR,defaultreqdir,TAG_DONE])
  705.         add_liste:=RtFileRequestA(reqfile,buffer,title_req,
  706.                                   [RTFI_FLAGS,FREQF_MULTISELECT,RTFI_OKTEXT,a,RTFI_HEIGHT,200,
  707.                                    RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,RT_UNDERSCORE,"_",TAG_DONE])
  708.         StrCopy(defaultreqdir,reqfile.dir,ALL)
  709.         StrCopy(thefile,reqfile.dir,ALL)
  710.         IF reqfile THEN RtFreeRequest(reqfile)
  711.         IF add_liste THEN ret:=TRUE
  712.     ELSE
  713.         dWriteF(['p_WVFileRequester() Bad\n'],[0])
  714.         ret:=FALSE
  715.     ENDIF
  716.     IF ret=TRUE
  717.         liste:=add_liste
  718.         IF add_liste
  719.             AddPart(thefile,'',256)
  720.             WHILE liste
  721.                 StringF(the_reelname,'\s\s',thefile,liste.name)
  722.                 dWriteF(['Fichier :\s\n'],[the_reelname])
  723.                 p_ReadFile(the_reelname)
  724.                 liste:=liste.next
  725.             ENDWHILE
  726.             IF add_liste THEN RtFreeFileList(add_liste)
  727.         ENDIF
  728.     ELSE
  729.         ret:=FALSE
  730.     ENDIF
  731.     RETURN ret
  732. ENDPROC
  733. /**/
  734. /*"p_MakeRequest(bodytext,gadgettext,the_arg) :Juste un requester (reqtools.library)."*/
  735. PROC p_MakeRequest(bodytext,gadgettext,the_arg)
  736. /*===============================================================================
  737.  = Para         : texte (STRING),gadgets (STRING),the_arg.
  738.  = Return       : FALSE if cancel selected,else TRUE.
  739.  = Description  : PopUp a requester (reqtools.library).
  740.  ==============================================================================*/
  741.     DEF ret
  742.     dWriteF(['p_MakeWVRequest()\n'],[0])
  743.     ret:=RtEZRequestA(bodytext,gadgettext,0,the_arg,[RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,RTEZ_REQTITLE,title_req,RT_UNDERSCORE,"_",0])
  744.     RETURN ret
  745. ENDPROC
  746. /**/
  747. /*"p_MakePaletteRequest(titre,couleur) :PopUp the reqtools palette requester."*/
  748. PROC p_MakePaletteRequest(titre,couleur)
  749.     DEF i:PTR TO intuitionbase,win:PTR TO window,ret
  750.     i:=intuitionbase
  751.     win:=i.activewindow
  752.     ret:=RtPaletteRequestA(titre,NIL,[RT_WINDOW,win,RT_LOCKWINDOW,TRUE,RTPA_COLOR,couleur,0])
  753.     RETURN ret
  754. ENDPROC
  755. /**/
  756. /*"p_RefreshScreenTitle()"*/
  757. PROC p_RefreshScreenTitle()
  758.     DEF e[20]:STRING
  759.     StrCopy(e,p_FloatToString(mybase.echelle),ALL)
  760.     StringF(titlescreen,'\l\s[32]       \s:\s Sx:\d[2] Sy:\d[2] Sz:\d[2] \s:\s',title_req,get_3DView_string(DMENU_VUES),stringvue[mybase.plan],mybase.signex,mybase.signey,mybase.signez,get_3DView_string(TEXT_SCALE),e)
  761.     SetWindowTitles(view_window,'',titlescreen)
  762.     IF info_window
  763.         SetWindowTitles(info_window,'3DView Informations.',titlescreen)
  764.     ENDIF
  765.     IF config_window
  766.         SetWindowTitles(config_window,'3DView Configuration.',titlescreen)
  767.     ENDIF
  768. ENDPROC
  769. /**/
  770. /*"p_AllObjects(action) :Effectue une action sur tous les objets."*/
  771. PROC p_AllObjects(action)
  772.     DEF mylist:PTR TO lh,mynode:PTR TO ln,ob:PTR TO object3d
  773.     DEF bpts=0,bfcs=0
  774.     mylist:=mybase.objlist
  775.     mynode:=mylist.head
  776.     WHILE mynode
  777.         IF mynode.succ<>0
  778.             ob:=mynode
  779.             SELECT action
  780.                 CASE OBJ_SELECT
  781.                     ob.selected:=TRUE
  782.                 CASE OBJ_DESELECT
  783.                     ob.selected:=FALSE
  784.                 CASE OBJ_COUNTPTSFCS
  785.                     bpts:=bpts+ob.nbrspts
  786.                     bfcs:=bfcs+ob.nbrsfcs
  787.                 DEFAULT
  788.                     NOP
  789.             ENDSELECT
  790.         ENDIF
  791.         mynode:=mynode.succ
  792.     ENDWHILE
  793.     mybase.totalpts:=bpts
  794.     mybase.totalfcs:=bfcs
  795.     mybase.nbrsobjs:=p_CountNodes(mybase.objlist)
  796. ENDPROC
  797. /**/
  798. /*"p_StringTOFloat(string)"*/
  799. PROC p_StringToFloat(string)
  800.     DEF entier[256]:STRING
  801.     DEF decimal[256]:STRING
  802.     DEF pos
  803.     DEF ei,di,ef,df,vir,p,res=0
  804.     pos:=InStr(string,'.',0)
  805.     IF pos<>-1
  806.         MidStr(entier,string,0,pos)
  807.         MidStr(decimal,string,pos+1,ALL)
  808.         vir:=SpFlt(EstrLen(decimal))
  809.         ei:=Val(entier,NIL)
  810.         di:=Val(decimal,NIL)
  811.         ef:=SpFlt(ei)
  812.         p:=10
  813.         FOR pos:=1 TO SpFix(vir)-1
  814.             p:=Mul(p,10)
  815.         ENDFOR
  816.         df:=SpDiv(SpFlt(p),SpFlt(di))
  817.         res:=SpAdd(ef,df)
  818.         RETURN res
  819.     ENDIF
  820. ENDPROC
  821. /**/
  822. /*"p_FloatToString(float)"*/
  823. PROC p_FloatToString(float)
  824.     DEF r[80]:STRING
  825.     StringF(r,'\d.\z\d[7]',SpFix(float),
  826.             SpFix( SpMul( SpSub( SpFlt(SpFix(float)),float ),10000000.0 ) ))
  827.     RETURN r
  828. ENDPROC
  829. /**/
  830. /*"writefloat(float)"*/
  831. PROC writefloat(float)
  832.     WriteF('\d.\z\d[7]\n',SpFix(float),
  833.             SpFix( SpMul( SpSub( SpFlt(SpFix(float)),float ),10000000.0 ) ))
  834. ENDPROC
  835. /**/
  836. /*"p_StartWB()"*/
  837. PROC p_StartWB() HANDLE
  838.     DEF wb:PTR TO wbstartup
  839.     DEF args:PTR TO wbarg
  840.     DEF b
  841.     DEF mes:PTR TO mn,n:PTR TO ln
  842.     DEF source[256]:STRING
  843.     DEF fichier[256]:STRING
  844.     wb:=wbmessage
  845.     mes:=wb.message
  846.     n:=mes.ln
  847.     WHILE n
  848.         IF n.succ<>0
  849.             wb:=n
  850.             dWriteF(['NumArgs :\d\n'],[wb.numargs])
  851.             args:=wb.arglist
  852.             FOR b:=1 TO wb.numargs-1
  853.                 NameFromLock(args[b].lock,source,256)
  854.                 AddPart(source,'',256)
  855.                 StringF(fichier,'\s\s',source,args[b].name)
  856.                 dWriteF(['WB fichier :\s\n'],[fichier])
  857.                 arglist:=Link(fichier,arglist)
  858.                 p_ReadFile(fichier)
  859.             ENDFOR
  860.         ENDIF
  861.         n:=n.succ
  862.     ENDWHILE
  863.     /*
  864.     args:=wb.arglist
  865.     dWriteF(['NumArgs :\d\n'],[wb.numargs])
  866.     FOR b:=1 TO wb.numargs-1
  867.         NameFromLock(args[b].lock,source,256)
  868.         AddPart(source,'',256)
  869.         StringF(fichier,'\s\s',source,args[b].name)
  870.         dWriteF(['WB fichier :\s\n'],[fichier])
  871.         p_ReadFile(fichier)
  872.     ENDFOR
  873.     */
  874.     Raise(ER_NONE)
  875. EXCEPT
  876.     RETURN exception
  877. ENDPROC
  878. /**/
  879. /*"p_StartCli()"*/
  880. PROC p_StartCli() HANDLE 
  881.     DEF myargs:PTR TO LONG,rdargs=NIL
  882.     DEF marg:PTR TO LONG,b=20
  883.     DEF n[256]:STRING
  884.     myargs:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
  885.     IF rdargs:=ReadArgs('FILES/M',myargs,NIL)
  886.         marg:=myargs[]
  887.         IF myargs[0]
  888.             FOR b:=0 TO 19
  889.                 IF marg[b]<>0
  890.                     IF b=0 THEN StrCopy(n,Long(myargs[0]),ALL) ELSE StrCopy(n,marg[b],ALL)
  891.                      IF ((FileLength(n)<>-1) AND (EstrLen(n)<>0))
  892.                         dWriteF(['Argcli \s ',' \s\n'],[n,EstrLen(myargs[b])])
  893.                         p_ReadFile(n)
  894.                     ENDIF
  895.                 ENDIF
  896.             ENDFOR
  897.         ENDIF
  898.     ELSE
  899.         Raise(ER_BADARGS)
  900.     ENDIF
  901.     Raise(ER_NONE)
  902. EXCEPT
  903.     IF rdargs THEN FreeArgs(rdargs)
  904.     RETURN exception
  905. ENDPROC
  906. /**/
  907. /**/
  908. /*"main() :Main procédure."*/
  909. PROC main() HANDLE 
  910.     DEF testmain
  911.     p_DoReadHeader({banner})
  912.     localebase:=OpenLibrary('locale.library',0)
  913.     open_3DView_catalog(NIL,NIL)
  914.     IF (testmain:=p_OpenLibraries())<>ER_NONE THEN Raise(testmain)
  915.     IF (testmain:=p_Init3DBase())<>ER_NONE THEN Raise(testmain)
  916.     IF wbmessage<>NIL
  917.         IF (testmain:=p_StartWB())<>ER_NONE THEN Raise(testmain)
  918.     ELSE
  919.         IF (testmain:=p_StartCli())<>ER_NONE THEN Raise(testmain)
  920.     ENDIF
  921.     IF (testmain:=p_SetUpScreen())<>ER_NONE THEN Raise(testmain)
  922.     IF (testmain:=p_InitviewWindow())<>ER_NONE THEN Raise(testmain)
  923.     /*=============================================================
  924.     IF (testmain:=p_InitconfigWindow())<>ER_NONE THEN Raise(testmain)
  925.     IF (testmain:=p_InitinfoWindow())<>ER_NONE THEN Raise(testmain)
  926.     ===============================================================*/
  927.     IF (testmain:=p_OpenviewWindow())<>ER_NONE THEN Raise(testmain)
  928.     ActivateWindow(view_window)
  929.     /*===============================================================
  930.     IF (testmain:=p_OpeninfoWindow())<>ER_NONE THEN Raise(testmain)
  931.     IF (testmain:=p_OpenconfigWindow())<>ER_NONE THEN Raise(testmain)
  932.     =================================================================*/
  933.     IF p_EmptyList(mybase.objlist)<>-1 
  934.         p_AllObjects(OBJ_COUNTPTSFCS)
  935.         p_RebuildMinMax()
  936.         p_DrawBase()
  937.     ENDIF
  938.     REPEAT
  939.         p_LookAllMessage()
  940.     UNTIL reelquit=TRUE
  941.     Raise(ER_NONE)
  942. EXCEPT
  943.     IF view_window THEN p_RemviewWindow()
  944.     IF config_window THEN p_RemconfigWindow()
  945.     IF info_window THEN p_ReminfoWindow()
  946.     IF mybase THEN p_Rem3DBase()
  947.     IF screen THEN p_SetDownScreen()
  948.     p_CloseLibraries()
  949.     SELECT exception
  950.         CASE ER_SCREENSIG;  WriteF(get_3DView_string(DER_SCREENSIG))
  951.         CASE ER_SCREEN;     WriteF(get_3DView_string(DER_SCREEN))
  952.         CASE ER_LOCKSCREEN; WriteF(get_3DView_string(DER_LOCKSCREEN))
  953.         CASE ER_VISUAL;     WriteF(get_3DView_string(DER_VISUAL))
  954.         CASE ER_CONTEXT;    WriteF(get_3DView_string(DER_CONTEXT))
  955.         CASE ER_MENUS;      WriteF(get_3DView_string(DER_MENUS))
  956.         CASE ER_GADGET;     WriteF(get_3DView_string(DER_GADGET))
  957.         CASE ER_WINDOW;     WriteF(get_3DView_string(DER_WINDOW))
  958.         CASE ER_INTUITIONLIB; WriteF(get_3DView_string(DER_INTUITIONLIB))
  959.         CASE ER_GADTOOLSLIB;  WriteF(get_3DView_string(DER_GADTOOLSLIB))
  960.         CASE ER_GRAPHICSLIB;  WriteF(get_3DView_string(DER_GRAPHICSLIB))
  961.         CASE ER_DISKFONTLIB;  WriteF(get_3DView_string(DER_DISKFONTLIB))
  962.         CASE ER_REQTOOLSLIB;  WriteF(get_3DView_string(DER_REQTOOLSLIB))
  963.         CASE ER_MATHTRANSLIB; WriteF(get_3DView_string(DER_MATHTRANSLIB))
  964.         CASE ER_REXXSYSLIBLIB; WriteF(get_3DView_string(DER_REXXSYSLIBLIB))
  965.         CASE ER_FONT;         WriteF(get_3DView_string(DER_FONT))
  966.         CASE ER_PORT;         WriteF(get_3DView_string(DER_PORT))
  967.         CASE ER_PORTEXIST;    WriteF(get_3DView_string(DER_PORTEXIST))
  968.         CASE ER_CREATEPORT;   WriteF(get_3DView_string(DER_CREATEPORT))
  969.     ENDSELECT
  970.     close_3DView_catalog()
  971.     IF localebase THEN CloseLibrary(localebase)
  972. ENDPROC
  973. /**/
  974.